import { ElMessage, ElMessageBox } from 'element-plus'
import router from '@/router'

/**
 * 全局权限验证中间件
 * 用于处理所有API请求的403权限不足错误
 */
class PermissionMiddleware {
  constructor() {
    this.isHandling = false
  }

  /**
   * 处理403权限不足错误
   * @param {Object} error - 错误对象
   * @param {Object} options - 配置选项
   */
  handlePermissionDenied(error, options = {}) {
    if (this.isHandling) return

    const { 
      showMessage = true, 
      showBox = false, 
      redirectTo = null,
      customMessage = null,
      silent = false 
    } = options

    // 如果设置为静默模式，不显示任何提示
    if (silent) return

    this.isHandling = true

    try {
      // 获取错误信息
      let message = customMessage
      if (!message && error.response && error.response.data) {
        const data = error.response.data
        if (data.message) {
          message = data.message
        } else if (data.data && data.data.RequiredPermission) {
          message = `权限不足，需要 '${data.data.RequiredPermission}' 权限才能执行此操作`
        } else {
          message = '权限不足，无法访问此功能'
        }
      }

      if (!message) {
        message = '权限不足，无法访问此功能'
      }

      // 显示错误消息
      if (showMessage) {
        ElMessage.warning(message)
      }

      // 显示错误弹框
      if (showBox) {
        ElMessageBox.alert(
          message + '\n\n请联系管理员获取相应权限',
          '权限不足',
          {
            confirmButtonText: '确定',
            type: 'warning',
            callback: () => {
              if (redirectTo) {
                router.push(redirectTo)
              }
            }
          }
        )
      }

      // 记录权限错误日志
      console.warn('权限不足错误:', {
        url: error.config?.url,
        method: error.config?.method,
        status: error.response?.status,
        message: message,
        timestamp: new Date().toISOString()
      })
    } finally {
      this.isHandling = false
    }
  }

  /**
   * 检查用户是否有指定权限
   * @param {string} permissionCode - 权限代码
   * @returns {boolean} - 是否有权限
   */
  hasPermission(permissionCode) {
    if (!permissionCode) return true

    const userInfo = localStorage.getItem('userInfo')
    if (!userInfo) return false

    try {
      const user = JSON.parse(userInfo)
      const userPermissions = user.permissions || []
      return userPermissions.includes(permissionCode)
    } catch (error) {
      console.error('解析用户权限信息失败:', error)
      return false
    }
  }

  /**
   * 检查用户是否有任意一个权限
   * @param {Array} permissionCodes - 权限代码数组
   * @returns {boolean} - 是否有权限
   */
  hasAnyPermission(permissionCodes) {
    if (!permissionCodes || permissionCodes.length === 0) return true
    return permissionCodes.some(code => this.hasPermission(code))
  }

  /**
   * 检查用户是否有所有权限
   * @param {Array} permissionCodes - 权限代码数组
   * @returns {boolean} - 是否有权限
   */
  hasAllPermissions(permissionCodes) {
    if (!permissionCodes || permissionCodes.length === 0) return true
    return permissionCodes.every(code => this.hasPermission(code))
  }

  /**
   * 获取用户所有权限
   * @returns {Array} - 权限代码数组
   */
  getUserPermissions() {
    const userInfo = localStorage.getItem('userInfo')
    if (!userInfo) return []

    try {
      const user = JSON.parse(userInfo)
      return user.permissions || []
    } catch (error) {
      console.error('解析用户权限信息失败:', error)
      return []
    }
  }

  /**
   * 显示权限不足提示
   * @param {string} operation - 操作名称
   */
  showPermissionDeniedMessage(operation = '执行此操作') {
    ElMessage.warning(`您没有权限${operation}，请联系管理员`)
  }

  /**
   * 权限不足时隐藏元素
   * @param {HTMLElement} element - 要隐藏的元素
   */
  hideElement(element) {
    if (element) {
      element.style.display = 'none'
    }
  }

  /**
   * 权限不足时禁用元素
   * @param {HTMLElement} element - 要禁用的元素
   */
  disableElement(element) {
    if (element) {
      element.disabled = true
      element.style.opacity = '0.5'
      element.style.cursor = 'not-allowed'
    }
  }

  /**
   * 权限不足时执行操作
   * @param {string} permissionCode - 权限代码
   * @param {Function} callback - 有权限时的回调函数
   * @param {Function} fallback - 无权限时的回调函数
   */
  executeWithPermission(permissionCode, callback, fallback = null) {
    if (this.hasPermission(permissionCode)) {
      if (callback) callback()
    } else {
      if (fallback) {
        fallback()
      } else {
        this.showPermissionDeniedMessage()
      }
    }
  }
}

// 创建全局实例
const permissionMiddleware = new PermissionMiddleware()

export default permissionMiddleware 